#!/usr/bin/python
# -*- coding: UTF-8 -*-
from spider.requests_helper import Request
from lxml import html


def spider(key):
    """ 爬取京东网的图书数据 """
    url = "https://search.jd.com/Search?keyword={key}".format(key=key)

    # 获得html内容
    html_text = Request().get_html_text(url)

    # 获得xpath对象
    selector = html.fromstring(html_text)

    li_list = selector.xpath('//div[@id="J_goodsList"]/ul/li')
    book_info_list = []
    for li in li_list:
        book_info = {}
        p_class_name_a = li.xpath('div[@class="p-name"]/a')
        # 商品名称
        name = p_class_name_a[0].xpath('/em/text()')[0].strip()
        # 商品购买链接
        link = p_class_name_a[0].xpath('@href')[0]
        price = li.xpath('div[@class="p-price"]/strong/i/text()')
        if not price:
            price = li.xpath('div[@class="ebook_buy"]/p[@class="price e_price"]/span[@class="search_now_price"]/text()')

        # 店铺名称
        shop_name = li.xpath('div[@class="p-shopnum"]/a/@title')
        # 有写书是当当自营的没有店面名称 所有把店铺名称赋值为当当自营
        shop_name = shop_name[0] if shop_name else '当当自营'

        book_info['name'] = name
        book_info['link'] = link
        # 因为价格显示都是￥开头所有需要截取 以方便最后的比价
        # 也可以将
        book_info['price'] = float(price[0][1:])
        book_info['shop_name'] = shop_name

        book_info_list.append(book_info)

    # 排序前
    # print(str(book_info_list))
    """
    sort()方法语法：
        list.sort(cmp=None, key=None, reverse=False)
    参数
        cmp -- 可选参数, 如果指定了该参数会使用该参数的方法进行排序。
        key -- 主要是用来进行比较的元素，只有一个参数，具体的函数的参数就是取自于可迭代对象中，指定可迭代对象中的一个元素来进行排序。
        reverse -- 排序规则，reverse = True 降序， reverse = False 升序（默认）。
    """
    """
        lambda的一般形式是关键字lambda后面跟一个或多个参数，紧跟一个冒号，以后是一个表达式。lambda是一个表达式而不是一个语句。
        它能够出现在Python语法不允许def出现的地方。作为表达式，lambda返回一个值（即一个新的函数）。
        lambda用来编写简单的函数，而def用来处理更强大的任务。
    """
    book_info_list.sort(key=lambda info: info['price'], reverse=False)
    # 排序后
    # print(str(book_info_list))
    return book_info_list


if __name__ == '__main__':
    sn = 9787121309540
    print(str(spider(sn)))
